package com.googlecode.allinclusive.fw.database.hibernate;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;

import org.hibernate.criterion.DetachedCriteria;
import org.springframework.orm.hibernate3.HibernateTemplate;

import com.googlecode.allinclusive.fw.core.pagination.Pagination;

public interface EntityManager {
	
	/**
	 * 返回HibernateTemplate对象
	 * @return HibernateTemplate对象
	 */
	public HibernateTemplate getHibernateTemplate();

	/**
	 * 查询记录
	 * @param clazz 数据类型
	 * @param id 主键值
	 * @return 查询结果
	 */
    public <T> T get(Class<T> clazz, Serializable id);

	/**
	 * 新增记录
	 * @param entity 
	 */
	public Serializable save(Object entity);
	
	/**
	 * 新增记录
	 * @param collection 
	 */
	public Collection<Serializable> save(Collection collection);

	/**
	 * 更新记录
	 * @param entity 
	 */
	public void update(Object entity);
	
	/**
	 * 更新记录
	 * @param collection 
	 */
	public void update(Collection collection);
	
	/**
	 * 新增或更新记录
	 * @param entity 
	 */
	public void saveOrUpdate(Object entity);
	
	/**
	 * 新增或更新记录
	 * @param collection 
	 */
	public void saveOrUpdate(Collection collection);

	/**
	 * 删除记录
	 * @param entity 
	 */
	public void delete(Object entity);
	
	/**
	 * 删除记录
	 * @param collection 
	 */
	public void delete(Collection collection);

	/**
	 * 查询符合条件的记录
	 * @param criteria 查询条件
	 * @return 查询结果
	 */
	public <T> T queryObject(DetachedCriteria criteria);
	
	/**
	 * 查询符合条件的记录
	 * @param criteria 查询条件
	 * @return 查询结果
	 */
	public <T> List<T> queryObjectList(DetachedCriteria criteria);
	
	/**
	 * 查询符合条件的指定记录
	 * @param criteria 查询条件
	 * @param firstResult 开始记录
	 * @param maxResults 最大记录数
	 * @return 查询结果
	 */
	public <T> List<T> queryObjectList(DetachedCriteria criteria, int firstResult, int maxResults);
	
	/**
	 * 查询符合条件的指定页记录
	 * @param criteria 查询条件
	 * @param pagination 页码
	 * @return 查询结果
	 */
	public <T> List<T> queryObjectList(DetachedCriteria criteria, Pagination pagination);
	
	/**
	 * 根据HQL语句查询记录
	 * @param sql HQL语句
	 * @param params 参数
	 * @return 查询结果
	 */
	public <T> T queryObjectByHQL(String sql, final Object[] params);
	
	/**
	 * 根据HQL语句查询记录
	 * @param sql HQL语句
	 * @param params 参数
	 * @return 查询结果
	 */
	public <T> List<T> queryObjectListByHQL(String sql, final Object[] params);
	
	/**
	 * 执行HQL语句
	 * @param sql HQL语句
	 * @param params 参数
	 * @return 执行结果
	 */
	public int executeHQL(String sql, final Object[] params);
	
	/**
	 * 计算符合条件的记录总数
	 * @param criteria 查询条件
	 * @return 记录总数
	 */
	public int rowCount(DetachedCriteria criteria);
	
}
